一次又一次的WA,是得到更好的AC的必经之路。
首先附上题目链接,当时并没有做出来,总感觉和欧拉函数有关,然而并没有用上,上网一搜,才发现竟然是容斥原理的入门题,天啊,这个都还没学,看来平时自己的积累才是王道,学习要主动,加油!!!
咦,为何题目图片传不上来。。。。。。
算了,直接上代码了
#include
#include
#define N 10000000
using namespace std;
int prime[N],cnt=0;
void creat_prime(int n) //欧几里得算法 求 输入n所有的质因数
{
int i;
for(i=2;i*i<=n;i++){
if(n%i==0){
prime[cnt++]=i;
while(n%i==0){
n/=i;
}
}
}
if(n>1) prime[cnt++]=n;
}
int fun(int up) //求从 1-UP 内, 与n有 公因子 的 数字 的数量
{
int c,i,j,tp,sum=0;
for(i=1;i<(1<
< cnt;j++){ // 循环所有因子
if(i & (1<
>T;
while(T--){
cin>>a>>b>>n;
ans=cnt=0;
creat_prime(n);
ans+=b-fun(b)-(a-1-fun(a-1)); // 这个 就不用 说了吧, 但还是 要注意 用 a-1 而不是a
cout<
<
补充:刚学习了不用位运算,用数组来达到组合数的目的,原理大致相同,但写法不同,代码也上了,提醒自己一题多解
#include
#include
#define N 10000000
using namespace std;
int prime[N],cnt,tp[N],ans;
void creat_prime(int n)
{
int i;
for(i=2;i*i<=n;i++){
if(n%i==0){
prime[cnt++]=i;
while(n%i==0) n/=i;
}
}
if(n>1) prime[cnt++]=n;
}
int fun(int up)
{
int i,t=0,j,k,sum=0;
tp[t++]=-1; //保证奇加偶减
for(i=0;i
>T;
while(T--){
scanf("%d%d%d",&a,&b,&n);
ans=cnt=0;
creat_prime(n);
ans=b-fun(b)-(a-1-fun(a-1));
cout<
<