我有一个任务,在C++中使用K个颜色查找不同项链的数量。
如果一个项链不能通过旋转第二个项链的任何角度获得第二个项链,则认为两个项链是不同的。找到模(10^9+7)下不同项链的总数。
我认为这个公式可以解决问题:
并且我使用C ++实现了一个程序:
如果一个项链不能通过旋转第二个项链的任何角度获得第二个项链,则认为两个项链是不同的。找到模(10^9+7)下不同项链的总数。
我认为这个公式可以解决问题:
并且我使用C ++实现了一个程序:
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int M = 1e9 + 7;
int main()
{
long long n, k;
cin >> n >> k;
long long x = 0;
for (int i = 0; i < n; ++i) {
x += pow(k, __gcd(i,n));
}
cout << (int)(((double)1/n) * x) % M;
return 0;
}
我将我的代码与测试用例一起编程,但我的解决方案只通过了一半的测试用例。我找不到我的错误,而且我只看到了一个测试用例。
第一个测试用例是n = 5
和k = 2
,答案是8
。
我可能犯了什么错误?
++i
并不是你想象中的那样。具体来说,for循环条件总是按照初始化器、终止条件和增量器的顺序进行评估。因此,在for循环中写入++i
或i++
都没有关系。但由于++i
可能会误导人们认为循环正在执行其他操作,因此始终建议使用i++
作为自我记录的提醒,以说明正在发生的事情。 - slebetmann
和k
都很小的情况下,x
也很可能超过甚至是long long
。取模运算是有原因的:你必须在每一步计算它。 - IVlad++i
而不是i++
。原因是后者有时比前者慢 - 不适用于像int
这样的内置类型,但适用于自定义类型。无论如何,在这里它们的语义是相同的,所以我不明白其中一个会让人困惑... - Konrad Rudolph